home *** CD-ROM | disk | FTP | other *** search
- ;/* genlockdemo.c - Amiga Mail Jan/Feb '91 Genlock VideoControl example.
- sc DATA=NEAR NMINC STRMERGE STREQ NOSTKCHK IGNORE=73 genlockdemo.c
- slink FROM LIB:c.o,genlockdemo.o TO genlockdemo LIBRARY LIB:sc.lib,LIB:amiga.lib
- quit
- */
- /*
- Copyright (c) 1991-1999 Amiga, Inc.
-
- This example is provided in electronic form by Amiga, Inc.
- for use with the Amiga Mail Volume II technical publication.
- Amiga Mail Volume II contains additional information on the correct
- usage of the techniques and operating system functions presented in
- these examples. The source and executable code of these examples may
- only be distributed in free electronic form, via bulletin board or
- as part of a fully non-commercial and freely redistributable
- diskette. Both the source and executable code (including comments)
- must be included, without modification, in any copy. This example
- may not be published in printed form or distributed with any
- commercial product. However, the programming techniques and support
- routines set forth in these examples may be used in the development
- of original executable software products for Amiga
- computers.
-
- All other rights reserved.
-
- This example is provided "as-is" and is subject to change; no
- warranties are made. All use is at your own risk. No liability or
- responsibility is assumed.
- */
-
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <graphics/gfxbase.h>
- #include <graphics/displayinfo.h>
- #include <graphics/VideoControl.h>
- #include <graphics/view.h>
- #include <intuition/intuition.h>
- #include <intuition/screens.h>
- #include <libraries/gadtools.h>
-
- #include <clib/alib_stdio_protos.h>
- #include <clib/intuition_protos.h>
- #include <clib/graphics_protos.h>
- #include <clib/exec_protos.h>
- #include <clib/gadtools_protos.h>
-
- /* Some gadget ID's */
- #define BORDERBLANK_ID 16
- #define BORDERNOTRANS_ID 17
- #define BITPLANEKEY_ID 18
- #define CHROMAPLANE_ID 19
- #define CHROMAKEY_ID 20
-
- /* Some protos */
- VOID main(VOID);
- BOOL CheckPAL(STRPTR);
- UWORD strlen(STRPTR);
-
- struct IntuitionBase *IntuitionBase;
- struct GfxBase *GfxBase;
- struct Library *GadToolsBase;
-
-
- /* Give me 3D look window (I'll use a quiet screen */
- static UWORD dri_Pens[] =
- {0, 1, 1, 2, 1, 3, 1, 0, 3, ~0};
-
- /* Just a demo, set everything to topaz 80. */
- static struct TextAttr Topaz80 = {"topaz.font", 8, 0, 0,};
-
-
- /* strings for cycle gadget */
- static STRPTR ChPlaneText[] = {"Plane 0", "Plane 1", "Plane 2", "Plane 3", NULL};
-
-
- struct EasyStruct failedES = {sizeof(struct EasyStruct), 0, "GenlockDemo", "%s", "Continue",};
-
-
- VOID main(VOID)
- {
- struct Screen *genscreen;
- struct Window *controlwindow;
- struct Gadget *glist, *gadget, *hitgadget;
- struct ViewPort *vp;
- void *vi;
- struct NewGadget ng;
- struct IntuiMessage *imsg;
- struct TagItem vtags[24];
- ULONG GadgetPtrs[21];
- ULONG iclass, icode;
- STRPTR gtextbuffer, gtextptr;
- UWORD i, j;
- BOOL ABORT = FALSE;
- BOOL IsPAL;
- /* Fails silently if < V37 */
- if (IntuitionBase = OpenLibrary("intuition.library", 37))
- {
- if (GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 37))
- {
- if (GadToolsBase = OpenLibrary("gadtools.library", 37))
- {
- if (GfxBase->ChipRevBits0 & GFXF_HR_DENISE)
- {
- /* Check if the user happens to prefer PAL or if this is a true PAL System. */
- IsPAL = CheckPAL("Workbench");
- /* buffer for some gadget text */
- if (gtextbuffer = AllocMem(256, MEMF_CLEAR))
- {
- gtextptr = gtextbuffer;
-
- /* Open a 'standard' HIRES screen */
- if (genscreen = OpenScreenTags(NULL, SA_Pens, (ULONG) dri_Pens,
- SA_DisplayID, HIRES_KEY,
- SA_Depth, 4,
- /* Give me a lot of border */
- SA_Width, 640,
- SA_Height, (IsPAL) ? 256 : 200,
- SA_Overscan, 0,
- /* Hold the titlebar, please */
- SA_Quiet, TRUE,
- /* Give me sysfont 0 as default rastport font. */
- SA_SysFont, 1,
- TAG_DONE))
- {
-
- /* Blast some colorbars in screen's rastport, leave some color 0 gaps */
- for (i = 0, j = 0; i < 16; i++, j += 40)
- {
- SetAPen(&(genscreen->RastPort), i);
- RectFill(&(genscreen->RastPort), (j + 1), 0, (j + 30), (IsPAL) ? 255 : 199);
-
- }
- /* A line to show where borders start */
- SetAPen(&(genscreen->RastPort), 5);
- Move(&(genscreen->RastPort),0,0);
- Draw(&(genscreen->RastPort),genscreen->Width-1,0);
- Draw(&(genscreen->RastPort),genscreen->Width-1,genscreen->Height-1);
- Draw(&(genscreen->RastPort),0,genscreen->Height-1);
- Draw(&(genscreen->RastPort),0,0);
-
- /* Open a restricted window, no draggin, sizing, just closing.
- * (don't want to refresh screen)
- */
- if (controlwindow = OpenWindowTags(NULL, WA_Title, (ULONG) "VideoControl",
- WA_Left, 210,
- WA_Top, 20,
- WA_Width, 220,
- WA_Height, 150,
- WA_CustomScreen, genscreen,
- WA_Flags, WFLG_CLOSEGADGET | WFLG_ACTIVATE | WFLG_NOCAREREFRESH,
- WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_GADGETUP,
- TAG_DONE))
- {
-
- /* Ok, got a window, lets make some gadgets */
- if (vi = GetVisualInfo(genscreen, TAG_END))
- {
- if (gadget = CreateContext(&glist))
- {
- ng.ng_TextAttr = &Topaz80;
- ng.ng_VisualInfo = vi;
- ng.ng_Flags = PLACETEXT_LEFT | NG_HIGHLABEL;
-
- ng.ng_LeftEdge = controlwindow->BorderLeft + 120;
- ng.ng_TopEdge = controlwindow->BorderTop + 2;
- ng.ng_Width = 12;
- ng.ng_Height = 12;
- ng.ng_GadgetText = "BORDERBLANK";
- ng.ng_GadgetID = BORDERBLANK_ID;
- gadget = CreateGadget(CHECKBOX_KIND, gadget, &ng, TAG_END);
- GadgetPtrs[BORDERBLANK_ID] = (ULONG) gadget;
-
- ng.ng_TopEdge += gadget->Height + 2;
- ng.ng_GadgetText = "BORDERNOTRANS";
- ng.ng_GadgetID = BORDERNOTRANS_ID;
- gadget = CreateGadget(CHECKBOX_KIND, gadget, &ng, TAG_END);
- GadgetPtrs[BORDERNOTRANS_ID] = (ULONG) gadget;
-
- ng.ng_TopEdge += gadget->Height + 2;
- ng.ng_GadgetText = "CHROMAKEY";
- ng.ng_GadgetID = CHROMAKEY_ID;
- gadget = CreateGadget(CHECKBOX_KIND, gadget, &ng, TAG_END);
- GadgetPtrs[CHROMAKEY_ID] = (ULONG) gadget;
-
- ng.ng_TopEdge += gadget->Height + 2;
- ng.ng_GadgetText = "BITPLANEKEY";
- ng.ng_GadgetID = BITPLANEKEY_ID;
- gadget = CreateGadget(CHECKBOX_KIND, gadget, &ng, TAG_END);
- GadgetPtrs[BITPLANEKEY_ID] = (ULONG) gadget;
-
- ng.ng_TopEdge += gadget->Height + 2;
- ng.ng_Width = 90;
- ng.ng_GadgetText = "CHROMAPLANE";
- ng.ng_GadgetID = CHROMAPLANE_ID;
- gadget = CreateGadget(CYCLE_KIND, gadget, &ng, GTCY_Labels, (ULONG) ChPlaneText,
- TAG_END);
- GadgetPtrs[CHROMAPLANE_ID] = (ULONG) gadget;
-
- ng.ng_TopEdge += gadget->Height + 20;
- ng.ng_Width = 12;
- ng.ng_Flags = PLACETEXT_ABOVE | NG_HIGHLABEL;
- for (j = 0; j < 2; j++)
- {
- for (i = 0; i < 8; i++)
- {
- ng.ng_LeftEdge = controlwindow->BorderLeft + 2 + (i * gadget->Width);
- sprintf(gtextptr, "%ld", i + (j * 8));
- ng.ng_GadgetText = gtextptr;
- ng.ng_GadgetID = i + (j * 8);
- gadget = CreateGadget(CHECKBOX_KIND, gadget, &ng, TAG_END);
- GadgetPtrs[i] = (ULONG) gadget;
- gtextptr += strlen(gtextptr) + 1;
- }
- ng.ng_TopEdge += gadget->Height;
- ng.ng_Flags = PLACETEXT_BELOW | NG_HIGHLABEL;
- }
- AddGList(controlwindow, glist, -1, -1, NULL);
- RefreshGList(glist, controlwindow, NULL, -1);
- GT_RefreshWindow(controlwindow, NULL);
-
- /* Finally, a window with some gadgets...
- *
- * Get the current genlock state.
- * Obviously I already know what the settings will be (all off),
- * since I opened the screen myself. Do it just to show how to get them.
- */
-
- vp = &(genscreen->ViewPort);
-
-
-
-
- /* Is borderblanking on? */
- vtags[0].ti_Tag = VTAG_BORDERBLANK_GET;
- vtags[0].ti_Data = NULL;
- /* Is bordertransparent set */
- vtags[1].ti_Tag = VTAG_BORDERNOTRANS_GET;
- vtags[1].ti_Data = NULL;
- /* Key on bitplane? */
- vtags[2].ti_Tag = VTAG_BITPLANEKEY_GET;
- vtags[2].ti_Tag = NULL;
- /* Get plane which is used to key on */
- vtags[3].ti_Tag = VTAG_CHROMA_PLANE_GET;
- vtags[3].ti_Data = NULL;
- /* Chromakey overlay on? */
- vtags[4].ti_Tag = VTAG_CHROMAKEY_GET;
- vtags[4].ti_Data = NULL;
-
- for (i = 0; i < 16; i++)
- {
- /* Find out which colors overlay */
- vtags[i + 5].ti_Tag = VTAG_CHROMA_PEN_GET;
- vtags[i + 5].ti_Data = i;
- }
-
- /* Indicate end of tag array */
- vtags[21].ti_Tag = VTAG_END_CM;
- vtags[21].ti_Data = NULL;
-
- /* And send the commands. On return the Tags themself will
- * indicate the genlock settings for this ViewPort's ColorMap.
- */
- VideoControl(vp->ColorMap, vtags);
-
- /* And initialize gadgets, according to genlock settings */
- if (vtags[0].ti_Tag == VTAG_BORDERBLANK_SET)
- GT_SetGadgetAttrs((struct Gadget *) GadgetPtrs[BORDERBLANK_ID],
- controlwindow, NULL, GTCB_Checked, TRUE, TAG_DONE);
- if (vtags[1].ti_Tag == VTAG_BORDERNOTRANS_SET)
- GT_SetGadgetAttrs((struct Gadget *) GadgetPtrs[BORDERNOTRANS_ID],
- controlwindow, NULL, GTCB_Checked, TRUE, TAG_DONE);
- if (vtags[2].ti_Tag == VTAG_BITPLANEKEY_SET)
- GT_SetGadgetAttrs((struct Gadget *) GadgetPtrs[BITPLANEKEY_ID],
- controlwindow, NULL, GTCB_Checked, TRUE, TAG_DONE);
- if (vtags[3].ti_Tag == VTAG_CHROMA_PLANE_SET)
- GT_SetGadgetAttrs((struct Gadget *) GadgetPtrs[CHROMAPLANE_ID],
- controlwindow, NULL, GTCY_Active, vtags[3].ti_Data,
- TAG_DONE);
- if (vtags[4].ti_Tag == VTAG_CHROMAKEY_SET)
- GT_SetGadgetAttrs((struct Gadget *) GadgetPtrs[CHROMAKEY_ID],
- controlwindow, NULL, GTCB_Checked, TRUE, TAG_DONE);
- for (i = 0; i < 16; i++)
- {
- if (vtags[i + 5].ti_Tag == VTAG_CHROMA_PEN_SET)
- GT_SetGadgetAttrs((struct Gadget *) GadgetPtrs[i],
- controlwindow, NULL, GTCB_Checked, TRUE);
- }
-
- /* Will only send single commands from here on. */
- vtags[1].ti_Tag = VTAG_END_CM;
-
- /* Get user input. */
- do
- {
- WaitPort(controlwindow->UserPort);
- while (imsg = GT_GetIMsg(controlwindow->UserPort)) {
- iclass = imsg->Class;
- icode = imsg->Code;
- hitgadget = (struct Gadget *) imsg->IAddress;
- GT_ReplyIMsg(imsg);
-
-
-
- switch (iclass)
- {
- case GADGETUP:
- if (hitgadget->GadgetID < 16)
- {
- /* Set colorkey */
- if (hitgadget->Flags & SELECTED)
- vtags[0].ti_Tag = VTAG_CHROMA_PEN_SET;
- /* Clear colorkey */
- else
- vtags[0].ti_Tag = VTAG_CHROMA_PEN_CLR;
- vtags[0].ti_Data = hitgadget->GadgetID;
- }
- else
- {
- switch (hitgadget->GadgetID) {
- case BORDERBLANK_ID:
- /* Set borderblanking on */
- if (hitgadget->Flags & SELECTED)
- vtags[0].ti_Tag =
- VTAG_BORDERBLANK_SET;
- /* Turn borderblanking off */
- else
- vtags[0].ti_Tag =
- VTAG_BORDERBLANK_CLR;
- break;
- case BORDERNOTRANS_ID:
- /* Set bordertransparency on */
- if (hitgadget->Flags & SELECTED)
- vtags[0].ti_Tag =
- VTAG_BORDERNOTRANS_SET;
- /* Turn bordertransparency off */
- else
- vtags[0].ti_Tag =
- VTAG_BORDERNOTRANS_CLR;
- break;
- case BITPLANEKEY_ID:
- /* Key on current selected bitplane
- * (chromaplane) */
- if (hitgadget->Flags & SELECTED)
- vtags[0].ti_Tag =
- VTAG_BITPLANEKEY_SET;
- /* Turn bitplane keying off */
- else
- vtags[0].ti_Tag =
- VTAG_BITPLANEKEY_CLR;
- break;
- case CHROMAPLANE_ID:
- /* Set plane to key on */
- vtags[0].ti_Tag = VTAG_CHROMA_PLANE_SET;
- vtags[0].ti_Data = icode;
- break;
- case CHROMAKEY_ID:
- /* Set chromakey overlay on */
- if (hitgadget->Flags & SELECTED)
- vtags[0].ti_Tag = VTAG_CHROMAKEY_SET;
- /* Turn chromakey overlay off */
- else
- vtags[0].ti_Tag = VTAG_CHROMAKEY_CLR;
- break;
- }
- }
-
-
-
-
-
-
-
- /* send video command */
- VideoControl(vp->ColorMap, vtags);
- /* Now use MakeScreen() and RethinkDisplay()
- * to make the VideoControl changes
- * take effect. If we were using our own
- * Viewport rather than borrowing one from
- * a screen, we would instead do:
- * MakeVPort(ViewAddress(),vp);
- * MrgCop(ViewAddress());
- * LoadView(ViewAddres());
- */
- MakeScreen(genscreen);
- RethinkDisplay();
- break;
-
- case CLOSEWINDOW:
- /* Get out of here */
- ABORT = TRUE;
- break;
- }
- }
- }
- while (ABORT == FALSE);
-
- RemoveGList(controlwindow, glist, -1);
- FreeGadgets(glist);
- }
- else
- EasyRequest(NULL, &failedES, NULL, "Can't create gadget context");
- FreeVisualInfo(vi);
- }
- else
- EasyRequest(NULL, &failedES, NULL, "Can't get visual info");
- CloseWindow(controlwindow);
- }
- else
- EasyRequest(NULL, &failedES, NULL, "Can't open window");
- CloseScreen(genscreen);
- }
- else
- EasyRequest(NULL, &failedES, NULL, "Can't open screen");
- FreeMem(gtextbuffer, 256);
- }
- else
- EasyRequest(NULL, &failedES, NULL, "Out of memory");
- }
- else
- EasyRequest(NULL, &failedES, NULL, "Requires ECS");
- CloseLibrary(GadToolsBase);
- }
- CloseLibrary((struct Library *) GfxBase);
- }
- CloseLibrary(IntuitionBase);
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
- BOOL CheckPAL(STRPTR screenname)
- {
- struct Screen *screen;
- ULONG modeID = LORES_KEY;
- struct DisplayInfo displayinfo;
- BOOL IsPAL;
-
- if (GfxBase->LibNode.lib_Version >= 36)
- {
- /*
- * We got V36, so lets use the new calls to find out what
- * kind of videomode the user (hopefully) prefers.
- */
-
- if (screen = LockPubScreen(screenname))
- {
- /*
- * Use graphics.library/GetVPModeID() to get the ModeID of the specified screen.
- * Will use the default public screen (Workbench most of the time) if NULL It is
- * _very_ unlikely that this would be invalid, heck it's impossible.
- */
- if ((modeID = GetVPModeID(&(screen->ViewPort))) != INVALID_ID)
- {
- /*
- * If the screen is in VGA mode, we can't tell whether the system is PAL or NTSC. So
- * to be fullproof we fall back to the displayinfo of the default.monitor by
- * inquiring about just the LORES_KEY displaymode if we don't know. The
- * default.monitor reflects the initial video setup of the system, thus is an alias
- * for either ntsc.monitor or pal.monitor. We only use the displaymode of the
- * specified public screen if it's display mode is PAL or NTSC and NOT the default.
- */
-
- if (!((modeID & MONITOR_ID_MASK) == NTSC_MONITOR_ID ||
- (modeID & MONITOR_ID_MASK) == PAL_MONITOR_ID))
- modeID = LORES_KEY;
- }
- UnlockPubScreen(NULL, screen);
- } /* if fails modeID = LORES_KEY. Can't lock screen, so fall back on default monitor. */
-
- if (GetDisplayInfoData(NULL, (UBYTE *) & displayinfo,
- sizeof(struct DisplayInfo), DTAG_DISP, modeID))
- {
- if (displayinfo.PropertyFlags & DIPF_IS_PAL)
- IsPAL = TRUE;
- else
- IsPAL = FALSE; /* Currently the default monitor is always either
- * PAL or NTSC.
- */
- }
- }
- else /* < V36. The enhancements to the videosystem in V36 cannot be better expressed than
- * with the simple way to determine PAL in V34.
- */
- IsPAL= (GfxBase->DisplayFlags & PAL) ? TRUE : FALSE;
-
- return(IsPAL);
- }
-
-
-
-